TITL DAI FIRMWARE 2EA0B-2EBF3 V1.1 ORG :EA0B * * * ************** * FILL BLOCK * ************** * * Fills a rectangular block of whole fields with * one colour. * * Entry: HL: Address bottom left corner. * DE: Y,X-counts of size of block (E in * fields). * FCOLR: Colour info. * Exit: BCDEHL preserved. AF corrupted. * FILBK PUSH B PUSH D PUSH H LDA :00C2 ) Get details for colour MOV C,A ) required in BC LDA :00C3 ) MOV B,A ) INR E Count range up by 1 FBK10 PUSH D PUSH H FBK20 LDA :00C1 Get animate flag ORA A JNZ :EA46 Jump if set LDA :009D Get current screen mode RAR RAR MOV M,B Colour details in screen RAM DCX H JNC :EA3E Jump if 16-colour mode REM * If 4-colour mode: REM MOV M,C Colour details in screen RAM * FBK30 DCX H DCR E JNZ :EA19 Loop to do all fields POP H HL pnts to left of rectangle POP D Get Y-size count DCR D INR D JZ :EA53 Abort if ready DCR D Update Y-count CALL :EAC1 Update pntr to next line JMP :EA17 Next line REM * If 16-colour mode: REM FBK40 MOV A,M Get data from screen RAM ANI :0F Lonibble only (old BG) ORA C Add details MOV M,A Preserve old background JMP :EA2B REM * If animate: REM FBK50 PUSH H DCR B INR B JNZ :EA4D DCX H FBK60 MOV M,C Change whole field POP H DCX H JMP :EA2B Next field * FBK90 POP H POP D POP B RET * ************** * FILL STRIP * ************** * * Fills a vertical strip on the screen with one * colour. * * Entry: HL: Points to bottom field of strip. * B: Mask bits to change. * D: Height -1 of strip. * Exit: AF corrupted. BCDEHL preserved. * FILST PUSH B PUSH D PUSH H LDA :009D Get current screen mode RAR RAR JNC :EAA9 Jump if 16-colour mode REM * If 4-colour mode: REM PUSH D XCHG LHLD :00C2 Get details for colour reqd LDA :00C1 Get animate flag ORA A JNZ :EA91 Jump if set MOV A,B ) ANA H ) MOV C,A ) Mask for bits to be update MOV A,B ) ANA L ) MOV L,A ) MOV A,B CMA Bits to be preserved MOV B,A MOV H,A FST05 XCHG FST10 MOV A,B ANA M Pick up old colours ORA C MOV M,A Update top bits DCX H MOV A,D ANA M ORA E MOV M,A Update bottom bits INX H XTHL MOV A,H DCR H ORA A JZ :EABC Jump if ready XTHL CALL :EAC1 Update pointer JMP :EA79 Next line REM * If animate: REM FST15 PUSH H Preserve colour details MOV A,B ANA L MOV C,A Bits to be set in C MOV A,B CMA ORA L MOV B,A To be set MVI L,:00 MVI H,:FF For other byte POP PSW Get colour details ORA A JNZ :EAA6 PUSH B PUSH H POP B POP H FST18 JMP :EA78 REM * If 16-colour mode: REM FST20 LDA :00C2 Get 1 byte of details colour REM required MOV C,A Set colour as reqd FST30 CALL :E8DE Update MOV A,D DCR D ORA A JZ :EABD CALL :EAC1 Next line JMP :EAAD Next field REM * If ready: REM FST90 POP H FST91 POP H POP D POP B RET * ************************** * MOVE AND CHECK POINTER * ************************** * * DADCK: Moves a pointer 1 line up screen and * offsets to alternate area if necessary. * PTRCK: Checks a memory pointer and moves it * into or out of the archive area if * necessary. * * Exit: HL: New pointer. * DADCK LDA :0098 Get nr bytes/line CALL :E701 Add 1 line length PTRCK PUSH B PUSH D XCHG LHLD :0088 Get addr after end graphics REM area CALL :E6FB Compare HL-DE LHLD :0084 Get bottom archive area MOV B,H ) in BC MOV C,L ) LHLD :0082 Get top visible area JNC :EAE5 Jump if pntr is below REM visible screen CALL :E6FB Compare HL-DE JC :D80F Jump if pntr is off top REM visible screen PCK10 XCHG PCK15 POP D POP B RET REM * If pntr is below visible screen: REM PCK20 PUSH H ) PUSH B ) Swop BC and HL POP H ) POP B ) CALL :E6FB Compare HL-DE JC :EAE1 Jump if within archive area PCK30 XCHG CALL :E6F2 Subtract nearest boundary DAD B Add other JMP :EAE2 * *************************** * FILL A RECTANGULAR AREA * *************************** * * Entry: DE: Width. * B : Height. * C : Offset. * HL: Address. * Exit: All registers preserved. * FILRT PUSH PSW PUSH B PUSH D PUSH H PUSH H MOV A,C ADD E MOV H,A H = C + E MVI A,:00 ADC D MOV D,B RAR MOV A,H JC :EB0D CPI :08 JC :EB40 If > 8: Fill only one strip L2E152 RAR RRC ANI :7E XTHL PUSH PSW RRC SUI :02 MOV E,A DCX H DCX H CNC :EA0B Fill block INX H INX H MOV A,C SUI :09 CMA MOV B,A CALL :EBE1 Set mask for bits CALL :EA57 Fill strip POP PSW CMA MOV C,A MVI B,:FF INX B DAD B POP PSW ANI :07 INR A MOV B,A MVI C,:00 L2E153 CALL :EBE1 Set mask for bits CALL :EA57 Fill strip JMP :E138 Popall, ret REM * If < 1 field: REM L2E154 MOV B,E INR B POP H JMP :EB37 Fill a strip only * ************************* * CALCULATE HL = A * HL * ************************* * * Exit: AFBCDE preserved. * HLMUL PUSH PSW PUSH D XCHG Original HL in DE LXI H,:0000 Init result L2E156 ORA A JZ :EB5D Abort if ready RAR ) PUSH PSW ) JNC :EB56 ) Calc HL = A * HL DAD D ) L2E157 XCHG ) DAD H ) XCHG ) POP PSW ) JMP :EB4C Cont multiplication L2E158 POP D POP PSW RET * ************************* * CALCULATE HL = HL / A * ************************* * * Exit: AFBCDE preserved. * HLDIV PUSH PSW ORA A JZ :EB78 Abort if A=0 PUSH B PUSH D LXI B,:FFFF CMA MOV E,A MVI D,:FF INX D L2E160 DAD D INX B JC :EB6F MOV L,C ) Result in HL MOV H,B ) POP D POP B L2E161 POP PSW RET * ********************************************* * CHECK IF SUFFICIENT ROOM FOR GRAPHIC MODE * ********************************************* * * Exit: CY=1: Insufficient room for mode. * CY=0: O.K. * ABCDEHL preserved. * TPOSN PUSH B PUSH PSW PUSH D LDA :009D Get current screen mode ADI :01 JC :EB96 If mode 0: Abort CY=1 XCHG LHLD :0094 Get nr of hor. blobs DCX H minus 1 CALL :E6FB Compare HL-DE XCHG JC :EB96 Abort CY=1 if insufficient REM room LDA :0096 Get nr of graphics lines DCR A minus 1 CMP C Set flags on difference L2E163 POP D POP B MOV A,B POP B RET * *********************************** * FIND COLOUR IN COLORG REGISTERS * *********************************** * * Entry: C: Requested colour. * Exit: CY=1: 'Serialnr' of colour in A. * CY=0: Colour not available. * BCDEHL preserved. * STR164 PUSH B PUSH H LXI H,:009E Addr 1st colour byte graph MVI B,:03 Total 4 colour data L2E165 MOV A,M Get colour ANI :0F Colour nibble only CMP C Ident to reqd one ? JZ :EBB2 Then colour found INX H Pnts to next one DCR B JP :EBA2 Get next colour ORA A CY=0 L2E166 POP H POP B RET REM * If colour found: REM L2E167 MVI A,:03 SUB B Colour 'nr' in A STC JMP :EBAF Quit, CY=1 * ********************** * GET MEMORY POINTER * ********************** * SMEMMK PUSH D PUSH PSW MOV A,B RRC MOV A,C RAR RAR ANI :7E ADI :04 MOV E,A MVI D,:00 POP H PUSH H MOV L,H Entry A in L MVI H,:00 INX H +1 LDA :0098 Get nr bytes/line CALL :EB46 Calc HL=A*HL CALL :E6F2 HL=HL-DE XCHG Result in DE LHLD :0088 Get addr after end graph REM area DAD D Add offset CALL :EAC7 Check and move pntr POP PSW POP D RET * ********************* * SET MASK FOR BITS * ********************* * * Entry: B and C are data for mask. * Exit: B: Result. * AFCDEHL preserved. * SMKMSK PUSH PSW PUSH B XRA A A=0 L2E170 STC CY=1 RAR DCR B JNZ :EBE4 RAR (B) times L2E171 RAR DCR C JP :EBEA RAR until C <= 7F RAL POP B MOV B,A Result in B POP PSW RET * * * END